package database

import (
	"fmt"
	"log"

	"baize/config"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// 定义全局的db对象，我们执行数据库操作主要通过他实现。
var _db *gorm.DB

func init() {
	// 声明err变量，下面不能使用:=赋值运算符，否则_db变量会当成局部变量，导致外部无法访问_db变量
	var err error
	db_host := config.GetEnvDefault("DB_HOST", "127.0.0.1")
	db_port := config.GetEnvDefault("DB_PORT", "3306")
	db_user := config.GetEnvDefault("DB_USER", "root")
	db_password := config.GetEnvDefault("DB_PASSWORD", "Abcd!%4321")
	db_name := config.GetEnvDefault("DB_NAME", "baize")
	mysql_info := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", db_user, db_password, db_host, db_port, db_name)
	dsn := fmt.Sprintf("%s?charset=utf8&parseTime=True&loc=Local&timeout=10ms", mysql_info)

	//连接MYSQL, 获得DB类型实例，用于后面的数据库读写操作。
	_db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})

	if err != nil {
		log.Printf("mysql connect error %v", err)
	}

	if _db.Error != nil {
		log.Printf("database error %v", _db.Error)
	}
	sqlDB, _ := _db.DB()

	//设置数据库连接池参数
	sqlDB.SetMaxOpenConns(100) //设置数据库连接池最大连接数
	sqlDB.SetMaxIdleConns(20)  //连接池最大允许的空闲连接数，如果没有sql任务需要执行的连接数大于20，超过的连接会被连接池关闭

}

// 获取gorm db对象，其他包需要执行数据库查询的时候，只要通过database.getDB()获取db对象即可。
// 不用担心协程并发使用同样的db对象会共用同一个连接，db对象在调用他的方法的时候会从数据库连接池中获取新的连接
func GetDB() *gorm.DB {
	return _db
}
